from core.function import Function
from core.cuda import cuda_module


class ReLu(Function):
    def forward(self, x):
        """
        ReLU 激活函数的前向传播。

        参数:
            x (Variable): 输入变量。

        返回:
            Variable: 输出变量。
        """
        y = cuda_module.maximum(x, 0.0)
        return y

    def backward(self, gy):
        """
        ReLU 激活函数的反向传播。

        参数:
            gy (Variable): 输出变量的梯度。

        返回:
            Variable: 输入变量的梯度。
        """
        x, = self.inputs
        mask = x.data > 0
        gx = gy * mask
        return gx

    def relu(self, x):
        """
        对输入应用 ReLU 激活。

        参数:
            x (Variable): 输入变量。

        返回:
            Variable: 输出变量。
        """
        return self(x)

